﻿using System.Collections.Generic;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using SocialApi.Core.Request;
using SocialApi.Instagram.AppSettings;
using SocialApi.Instagram.Entities.Methods.Users;

namespace SocialApi.Instagram.Entities.Methods.Likes
{
    internal class LikeMethods : ILikeMethods
    {
        #region Члены ILikeMethods

        #region GET

        /// <summary>
        /// Получение спсика всех лайков текущей медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public IEnumerable<IUserMethods> Get(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            var jObject = JObject.Parse(Navigator.Instance.Get(url));
            InstagramService.CheckResult(jObject);
#if NET_4_5 || NET_4_0
            return jObject["data"].ToObject<IEnumerable<UserMethods>>();
#else
            return jObject["data"].ToObject<List<UserMethods>>() as IEnumerable<IUserMethods>;
#endif
        }

        /// <summary>
        /// Асинхроное получение спсика всех лайков текущей медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public async Task<IEnumerable<IUserMethods>> GetAsync(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            var result = await Navigator.Instance.GetAsync(url);
            var jObject = JObject.Parse(result);
            InstagramService.CheckResult(jObject);
#if NET_4_5 || NET_4_0
            return jObject["data"].ToObject<IEnumerable<UserMethods>>();
#else
            return jObject["data"].ToObject<List<UserMethods>>() as IEnumerable<IUserMethods>;
#endif
        }

        #endregion

        #region POST

        /// <summary>
        /// Добавление нового лайка в текущую медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public void Post(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            Navigator.Instance.Post(url);
        }

        /// <summary>
        /// Асинхроное добавление нового лайка в текущую медиа
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public async Task PostAsync(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            await Navigator.Instance.PostAsync(url);
        }

        #endregion

        #region DELETE

        /// <summary>
        /// Удаление лайка в текущей медиа 
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public void Delete(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            Navigator.Instance.Delete(url);
        }

        /// <summary>
        /// Асинхроное удаление лайка в текущей медиа 
        /// </summary>
        /// <param name="mediaId">Id текущей медиа</param>
        public async Task DeleteAsync(long mediaId)
        {
            var url = InstagramService.GetMethodUrl(ApiUrls.ApiBaseUrl, ApiUrls.Media, string.Format(ApiUrls.Like, mediaId));
            await Navigator.Instance.DeleteAsync(url);
        }

        #endregion

        #endregion
    }
}